home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 2 / Gekikoh Dennoh Club Vol. 2 (Japan).7z / Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin / fsw / pd / wavemu.lzh / scc2 / tail.s < prev    next >
Text File  |  1997-09-06  |  11KB  |  459 lines

  1.  
  2.     * テーブル&非常駐部分
  3.  
  4.         include        doscall.mac
  5.         include        iocscall.mac
  6.         include        macro.h
  7.  
  8.     * 外部から参照されるシンボル
  9.  
  10.     .xdef    wave_mem
  11.     .xdef    pcm_buf,work_buf
  12.     .xdef    fre_table
  13.     .xdef    tail
  14.     .xdef    user_SP
  15.  
  16.     .xdef    ERR_M2,ERR_M3,ERR_M4,ERR_M5,ERR_RI,ERR_NI,ERR_NF
  17.     .xdef    ALSTALL,OVERFLOW,daSTEREO
  18.     .xdef    fre_1
  19.     .xdef    ins_mes,no_install
  20.     .xdef    title,usage
  21.  
  22.     .xdef    read_switch,SW_SHITEI,SW_STEP,SW_NAME
  23.     .xdef    音色定義,常駐解除,REL
  24.  
  25.     * コピーバック対策など
  26.     .xdef    DMA_WINDOW_TOP,DMA_WINDOW,DMA_WINDOW_TALE,DMA_WINDOW_TALE2
  27.  
  28.     * 参照するシンボル
  29.     .xref    MEM_POS,BACK_V2,SHT_TITLE
  30.  
  31. A_dma_ch2    equ    $e84080
  32. A_pcm_data    equ    $ecc080
  33. A_pcm_command    equ    $ecc091
  34. A_pcm_status    equ    $ecc0a1
  35.  
  36. wait_LRCK    macro
  37.         movea.l    #A_dma_ch2,a0
  38.     @@:    btst.b    #0,(a0)            * dmac ch2 PCL
  39.         beq    @b
  40.     @@:    btst.b    #0,(a0)
  41.         bne    @b
  42.         endm
  43.  
  44.         .data
  45.         .bss
  46.         .quad
  47. work_buf:    ds.w    1024*2
  48. wave_mem:    ds.b    64*16*64
  49.  
  50. *****
  51.         .align    16    * 境界をそろえる
  52. DMA_WINDOW_TOP::
  53.         ds.b    8192
  54. DMA_WINDOW::
  55. pcm_buf:    ds.w    1024*2
  56. DMA_WINDOW_TALE:
  57.         ds.b    8192
  58. DMA_WINDOW_TALE2:
  59. *****
  60. fre_table:    ds.w    16384*2
  61. tail:
  62.         .quad
  63.         ds.b    32000
  64. user_SP:
  65.  
  66.         .text
  67.         .quad
  68. read_switch:
  69.         push    d0-d3/a0-a3
  70.         LEA    SW_YUUKOU,A0
  71.         LEA    1(A2),A1        * 文字数のスキップ
  72.         LEA    130(A0),A2        * ファイル名の指定場所
  73.         MOVEQ    #0,D3            * ファイル名のフラグ
  74.  
  75.     * Phase-1   何があるかを調べている
  76. SWITJP1:
  77. SWITLP1:    MOVE.B    (A1)+,D0        * 文字の読み込み
  78.         BEQ    SWEND
  79.         CMP.B    #' '+1,D0        * SPACE/TAB/CTRL はパスさせる
  80.         BCS    SWITLP1
  81.         CMP.B    #'-',D0            * スイッチ識別子にヒット
  82.         BEQ    SWITJP2
  83.         CMP.B    #'/',D0            * スイッチ識別子にヒット
  84.         BEQ    SWITJP2
  85.         CMP.B    #'>',D0            * リダイレクトにヒット
  86.         BEQ    SWEND
  87.         CMP.B    #'<',D0            * リダイレクトにヒット
  88.         BEQ    SWEND
  89.         CMP.B    #$22,D0            * " Phase  7
  90.         BEQ    SWITJP7
  91.         BRA    SWITJP3            * ファイル名だった
  92.     * Phase-2   スイッチの読み込み
  93. SWITJP2:    MOVE.B    (A1)+,D0
  94.         CMP.B    #'A',D0
  95.         BCS    SWITER1            * スイッチが適当でない
  96.         CMP.B    #'Z'+1,D0
  97.         BCS    SWT2J1            * 大文字のスイッチが見つかった
  98.         CMP.B    #'a',D0
  99.         BCS    SWITER1            * スイッチが適当でない
  100.         CMP.B    #'z'+1,D0
  101.         BCC    SWITER1            * スイッチが適当でない
  102.         SUB.B    #'a'-'A',D0        * 大文字を個文字に直す
  103.     SWT2J1:    SUB.B    #'A',D0            * スイッチの有効性を調べる
  104.         AND.W    #$FF,D0    
  105.         TST.B    (A0,D0.w)
  106.         BEQ    SWITER2            * 無効なスイッチが指定された
  107.         MOVE.B    #1,52(A0,D0.w)        * スイッチの指定フラグを立てる
  108.         MOVE.B    26(A0,D0.w),D1        * 後続を調べる
  109.         BEQ    SWITJP4            * 後続は何もなし
  110.         CMP.B    #1,D1
  111.         BEQ    SWITJP5            * 後続は数字
  112.         CMP.B    #2,D1
  113.         BEQ    SWITJP6            * 後続は文字列
  114.         BRA    SWITER3            * ワークエリアの内容がおかしい
  115.     * Phase-3   ファイル名の読み込み
  116. SWITJP3:    CMP.W    #1,D3
  117.         BEQ    SWITER4            * ファイル名が規定数よりも多く設定された
  118.         INC.W    D3            * ファイル名のカウント
  119.         LEA    (A2),A3
  120.         MOVE.B    D0,(A3)+        * チェックのために読み込んだ文字を書き込む
  121.     SWT3J2:    MOVE.B    (A1)+,D0        * 読み込み
  122.         CMP.B    #' '+1,D0
  123.         BCS    SWT3J1            * 読み込みの終了
  124.         CMP.B    #'-',D0            * Switch exit
  125.         BEQ    SWT3J1
  126.         CMP.B    #'/',D0
  127.         BEQ    SWT3J1
  128.         CMP.B    #'>',D0
  129.         BEQ    SWT3J1
  130.         CMP.B    #'<',D0
  131.         BEQ    SWT3J1
  132.         CMP.B    #$22,D0            * "
  133.         BEQ    SWT3J1
  134.         MOVE.B    D0,(A3)+        * 書き込み
  135.         BRA    SWT3J2
  136.     SWT3J1:    DEC.L    A1            * 一文字分もとに戻します
  137.         CLR.B    (A3)            * ファイル名の終に0を付ける
  138.         LEA    128(A2),A2        * ワークエリアを進める
  139.         BRA    SWITJP1            * もとに返る
  140.     * Phase-4   スイッチの後続は何もなかった
  141. SWITJP4:    BRA    SWITJP1            * もとに返る
  142.     * Phase-5   スイッチの後続は数字である
  143. SWITJP5:    MOVE.B    (A1),D1
  144.         CMP.B    #' '+1,D1
  145.         BCS    SWITJP1            * 何もなかった
  146.         CMP.B    #'/',D1
  147.         BEQ    SWITJP1            * 何もなかった
  148.         CMP.B    #'-',D1
  149.         BEQ    SWITJP1            * 何もなかった
  150.         CMP.B    #'>',D1
  151.         BEQ    SWITJP1            * 何もなかった
  152.         CMP.B    #'<',D1
  153.         BEQ    SWITJP1            * 何もなかった
  154.         CMP.B    #$22,D1            * "
  155.         BEQ    SWITJP1
  156.         CMP.B    #'$',D1
  157.         BEQ    SWT5J1            * 16進数である
  158.         CMP.B    #'0',D1
  159.         BCS    SWITJP1            * 何もなかった
  160.                         * BCS    SWITER5        * スイッチの後続が異常
  161.         CMP.B    #'9'+1,D1
  162.         BCC    SWITJP1            * 何もなかった
  163.                         * BCC    SWITER5        * スイッチの後続が異常
  164.         AND.W    #$FF,D0
  165.         ADD.B    D0,D0
  166.         LEA    78(A0,D0.w),A3        * 書き込み先
  167.         MOVEQ    #0,D1
  168.         MOVEQ    #0,D0
  169.     SWT5J2:    MOVE.B    (A1)+,D0        * 数字の読み込み
  170.         SUB.B    #'0',D0
  171.         BCS    SWT5J3            * 読み込み終了
  172.         CMP.B    #10,D0
  173.         BCC    SWT5J3            * 読み込み終了
  174.         ADD.W    D1,D1            *    D1=oldd1*2
  175.         MOVE.W    D1,D2            *    D2=oldd1*2
  176.         ADD.W    D2,D2            *    D2=oldd1*4
  177.         ADD.W    D2,D2            *    D2=oldd1*8
  178.         ADD.W    D0,D1            *  D1=oldD1*10+D0
  179.         ADD.W    D2,D1
  180.         BRA    SWT5J2
  181.  
  182.     SWT5J3:    MOVE.W    D1,(A3)            * 読み込み終了/書き込み
  183.         DEC.L    A1            * 一文字分もとに戻す
  184.         BRA    SWITJP1
  185.  
  186.     SWT5J1:    AND.W    #$FF,D0            * 16進数の読み込み
  187.         ADD.B    D0,D0
  188.         LEA    78(A0,D0.w),A3        * 書き込み先
  189.         INC.L    A1            * $をスキップ
  190.         MOVEQ    #0,D1
  191.         MOVEQ    #0,D0
  192.     SWT5J4:    MOVE.B    (A1)+,D0        * テキストより読み込み
  193.         CMP.B    #'0',D0
  194.         BCS    SWT5J3            * 読み込み終了
  195.         CMP.B    #'9'+1,D0
  196.         BCS    SWT5J5            * 0~9を読み込んだ
  197.         CMP.B    #'A',D0
  198.         BCS    SWT5J3            * 読み込み終了
  199.         CMP.B    #'F'+1,D0
  200.         BCS    SWT5J6            * A~Fを読み込んだ
  201.         CMP.B    #'a',D0
  202.         BCS    SWT5J3            * 読み込み終了
  203.         CMP.B    #'f'+1,D0
  204.         BCC    SWT5J3            * 読み込み終了
  205.         SUB.B    #'a'-10,D0        * a~fを読み込んだ
  206.         BRA    SWT5J7
  207.     SWT5J6:    SUB.B    #'A'-10,D0        * A~Fを読み込んだ
  208.         BRA    SWT5J7
  209.     SWT5J5:    SUB.B    #'0',D0            * 0~9を読み込んだ
  210.     SWT5J7:    ROL.W    #4,D1            * D1=D1*16+D0
  211.         OR.B    D0,D1
  212.         BRA    SWT5J4
  213.  
  214.     * Phase-6   スイッチの後続の文字列の読み込み
  215. SWITJP6:    ADD.B    #'A',D0            * スイッチをアスキーコードに直す
  216.         LEA    194+64(A0),A3
  217.     SWT6J1:    MOVE.B    (A3),D1            * 格納先を求める
  218.         BEQ    SWITER3            * ワークエリアの内容がおかしい
  219.         CMP.B    D1,D0
  220.         BEQ    SWT6J2            * 格納先が見つかった
  221.         LEA    128(A3),A3
  222.         BRA    SWT6J1
  223.     SWT6J2:    INC.L    A3
  224.     SWT6J3:    MOVE.B    (A1)+,D0        * 一文字読み込み
  225.         CMP.B    #'-',D0            * Switch exit
  226.         BEQ    SWT6J4
  227.         CMP.B    #'/',D0
  228.         BEQ    SWT6J4
  229.         CMP.B    #'>',D0
  230.         BEQ    SWT6J4
  231.         CMP.B    #'<',D0
  232.         BEQ    SWT6J4
  233.         CMP.B    #$22,D0            * "
  234.         BEQ    SWT6J4
  235.         CMP.B    #' '+1,D0
  236.         BCS    SWT6J4            * 読み込み終了
  237.         MOVE.B    D0,(A3)+
  238.         BRA    SWT6J3
  239.     SWT6J4:    DEC.L    A1            * 一文字戻す
  240.         CLR.B    (A3)            * 最後に0を書き込む
  241.         BRA    SWITJP1
  242.  
  243.     *  Phase-7   まとめしてい
  244. SWITJP7:    CLR.W    D0
  245.         CLR.W    D5
  246.     SWT7L1:    MOVE.B    (A1)+,D0
  247.         BEQ.w    SWT7J4        * exit2
  248.         CMP.B    #$22,D0
  249.         BEQ.w    SWT7J1        * exit
  250.         CMP.B    #'0',D0
  251.         BCS    SWITER5            * スイッチの後続が異常である
  252.         CMP.B    #'9'+1,D0
  253.         BCS    SWT7J3            * スイッチの後続の数字
  254.         CMP.B    #'A',D0
  255.         BCS    SWITER5            * スイッチの後続が異常である
  256.         CMP.B    #'Z'+1,D0
  257.         BCS    SWT7J2        * Nomal
  258.         SUB.B    #'a'-'A',D0
  259.         CMP.B    #'A',D0
  260.         BCS    SWITER5            * スイッチの後続が異常である
  261.         CMP.B    #'Z'+1,D0
  262.         BCC    SWITER5            * スイッチの後続が異常である
  263.     SWT7J2:    SUB.B    #'A',D0            * スイッチの有効性を調べる
  264.         TST.B    (A0,D0.w)
  265.         BEQ    SWITER2            * 無効なスイッチが指定された
  266.         MOVE.W    D0,D1
  267.         ADD.W    D1,D1            * SW_STEP
  268.         CLR.W    D2
  269.         MOVE.B    26(A0,D0.w),D5        * KOUZOKU
  270.         MOVE.B    #1,52(A0,D0.w)        * スイッチの指定フラグを立てる
  271.         BRA    SWT7L1
  272.     SWT7J1:    BRA    SWITJP1
  273.     SWT7J4:    DEC.W    A1
  274.         BRA    SWITJP1
  275.     SWT7J3:    CMP.B    #1,D5
  276.         BNE    SWITER5            * スイッチの後続が異常である
  277.         ADD.W    D2,D2
  278.         MOVE.W    D2,D4
  279.         ADD.W    D2,D2
  280.         ADD.W    D2,D2
  281.         ADD.W    D4,D2
  282.         SUB.W    #'0',D0
  283.         ADD.W    D0,D2
  284.         MOVE.W    D2,78(A0,D1.w)
  285.         BRA    SWT7L1
  286.  
  287. * 読み込み終了
  288. SWEND:        pop    d0-d3/a0-a3
  289.         MOVEQ    #0,D0
  290.         RTS
  291.  
  292. * エラー終了
  293. SWITER1:    * スイッチが不適当だった
  294.         PRINT    title
  295.         PRINT    usage            * 使い方の説明
  296.         BRA    SWR_ER
  297. SWITER2:    * 無効なスイッチを指定した
  298.         PRINT    ERR_M2
  299.         BRA    SWR_ER
  300. SWITER3:    * ワークエリアの内容がおかしい
  301.         PRINT    ERR_M3
  302.         BRA    SWR_ER
  303. SWITER4:    * スイッチが規定数より多く設定された
  304.         PRINT    ERR_M4
  305.         BRA    SWR_ER
  306. SWITER5:    * スイッチの後続が異常である
  307.         PRINT    ERR_M5
  308.         BRA    SWR_ER
  309. SWR_ER:        pop    d0-d3/a0-a3
  310.         DC.W    __EXIT
  311.  
  312. 常駐解除:
  313.         JSR    REL                * 常駐解除する
  314.         BNE    INSTER
  315.  
  316.     * コピーバック対策の解除
  317.         MOVE.L    (A1)+,37*4.w            * ベクタを戻す
  318.         *MOVE.L    (A1)+,37*4-4.w            * ベクタを戻す
  319.         MOVE.L    (A1)+,d0            * ベクタを戻す
  320.         move.l    (a1)+,($1a8)
  321.         move.l    (a1)+,($1ac)
  322.  
  323.     push    d0-a0/a2-a6
  324.  
  325.     move.w    SR,-(SP)
  326.     ori.w    #$0700,SR                *割り込み禁止
  327.  
  328.     movea.l    (a1)+,A0
  329.     move.l    A0,(($0100+_SYS_STAT)*4).w
  330.  
  331.     tst.b    $0CBC.w
  332.     beq    @f                    *68030未満
  333. *********************************************************
  334.     suba.l    A5,A5
  335.     moveq.l    #$03,D1
  336.     jsr    (A0)                    *キャッシュクリア
  337.  
  338. *    (注)    命令キャッシュが更新されていない可能性があるので
  339. *        この場合IOCSは使用できない。
  340.  
  341. @@:
  342.     move.w    (SP)+,SR                *割り込み許可
  343.     pop    d0-a0/a2-a6
  344.  
  345.     * Mach2対策
  346.     cmpi.w    #$4368,$00ed0098        * MACH2が入っているか?
  347.     bne    @f                * 入っていなかったら
  348.     move.b    #$31,$00e8e00d        * 許可
  349.     move.b    (a1)+,($ED009B)
  350.     move.b    #$00,$00e8e00d        * 禁止
  351. @@:
  352.  
  353.  
  354. * ここまで
  355.  
  356.         PEA    $10(A0)                * メモリブロックの解放
  357.         DC.W    __MFREE
  358.         ADDQ.W    #4,SP
  359.  
  360.         PRINT    ERR_RI                * 常駐解除できた
  361.         wait_LRCK
  362.         move.b    #%0001_0000,7(a0)        * DMAC stop
  363.         nop
  364.         nop
  365.         tst.b    ($e9a001)
  366.         nop
  367.  
  368.         DC.W    __EXIT
  369. INSTER:        PRINT    ERR_NI                * 常駐解除できなかった
  370.         DC.W    __EXIT
  371.  
  372. * 常駐チェック
  373. REL:        MOVE.L    MEM_POS,A0
  374.         LEA    -$10(A0),A0
  375. RELLPa:        MOVE.L    (A0),A0
  376.         CMPA.L    #0,A0
  377.         BEQ    RELERR
  378.         LEA    $100(A0),A1
  379.         LEA    SHT_TITLE,A2
  380.         MOVE.W    #BACK_V2-SHT_TITLE,D0
  381.         MOVEQ    #0,D7                * 問題:なぜこれがいるのでしょう?
  382.         BRA    RELJPa                * 答え:いきなりループを抜けるため。
  383.     RELLPb:    CMP.B    (A1)+,(A2)+
  384.     RELJPa:    DBNE    D0,RELLPb
  385.         BNE    RELLPa
  386.         MOVEQ    #0,D0                * 常駐解除可能だった
  387.         RTS
  388. RELERR:        MOVEQ    #1,D0                * 常駐解除できなかった
  389.         RTS
  390.  
  391. 音色定義:
  392.         moveq    #0,d7
  393.         moveq    #0,d1
  394. @@:
  395.         push    d7
  396.         lea    PSG,a0
  397.         moveq    #4,d0        * 音色定義の番号
  398.         move.w    d7,d1
  399.         trap    #5
  400.         pop    d7
  401.  
  402.         addq.w    #1,d7
  403.         cmp.w    #8,d7
  404.         bcs    @b
  405.  
  406.         rts
  407.  
  408.         .data
  409.         .quad
  410.         *       0 1 2 3 4 5 6 7 8 9 11 2 3 4 5 6 7 8 9 21 2 3 4 5
  411.         *       A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
  412. SW_YUUKOU:    dc.b    0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0 *スイッチ無/有効
  413.         dc.b    0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0 *後に無/数字/文字
  414. SW_SHITEI:    dc.b    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 *スイッチ指定flag
  415. SW_STEP:    dc.w    0,64,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 *初期値
  416. SW_NAME:    ds.b    128      * FILENAME
  417.  
  418.         .data
  419.         .quad
  420. ERR_M2:        DC.B    '無効なスイッチを指定しました。',$D,$A,0
  421. ERR_M3:        DC.B    'ワークエリアの内容がおかしいです。',$D,$A,0
  422. ERR_M4:        DC.B    'スイッチが規定数より多く設定されました。',$D,$A,0
  423. ERR_M5:        DC.B    'スイッチの後続が異常です。',$D,$A,0
  424. ERR_RI:        DC.B    'wavemu.xを常駐解除しました。',$D,$A,0
  425. ERR_NI:        DC.B    'wavemu.xは常駐していません。',$D,$A,0
  426. ERR_NF:        DC.B    'ファイル名の指定がされていません。',$D,$A,0
  427. ALSTALL:    DC.B    'すでに常駐しています。',$D,$A,0
  428. OVERFLOW:    dc.b    'スイッチの引数が適切ではありません。',$d,$a,0
  429. fre_1:        dc.b    '15.6KHz mode ',0
  430. ins_mes:    dc.b    'にて常駐します',$d,$a,0
  431. daSTEREO:    dc.b    $d,'!そのスイッチは無意味だよーん^^;',$d,$a,00
  432.  
  433.         .even
  434.         .data
  435. no_install:    dc.b    'Mercury Unitが装着されていません。',$d,$a,0
  436. title:        dc.b    '波形メモリ音源シミュレータ 内蔵音源版 (C)1997/9/6 Otankonas',$d,$a,0
  437. usage:        dc.b    'wavemu.x [switch1] [switch2] ...',$d,$a
  438.         dc.b    '    -Cn  ポリフォニックする数 default:5ch',$d,$a
  439.         dc.b    '    -Bn  連続転送するバッファの大きさ default:64words',$d,$a
  440.         dc.b    '    -R   常駐解除する',$d,$a
  441.         dc.b    0
  442.  
  443.         .quad
  444. PSG:        dc.b    -127,-127,-127,-127,-127,-127,-127,-127
  445.         dc.b    -127,-127,-127,-127,-127,-127,-127,-127
  446.         dc.b    127,127,127,127,127,127,127,127
  447.         dc.b    127,127,127,127,127,127,127,127
  448.  
  449.         .quad
  450.         .bss
  451.         end
  452.  
  453.         音源 : 波形メモリ方式
  454.    定義できる音色数 : 0-63
  455.     ボリュームの値 : 0-15
  456.      チャンネル数 : 可変(1-8)
  457.           周波数 : 可変
  458.       保証周波数 : 再生周波数/16未満。波形次第で上げることも可^^;
  459.